---
title: sql 练习
date: 2023-08-11
images: ['https://kodo.huixiangwuyou.com/blog/images/lianxi.png']
summary: 不定期更新 sql 中遇到的问题和答案，欢迎大家留言交流。
tags: 
 - SQLDB
---



### 数据库优化
#### 1.1
> 数据库设计优化
```js >folded 
# 表结构设计
范式化设计：依据数据库范式，合理拆分表，减少数据冗余，提升数据完整性。
例如，在一个电商系统里，把商品信息和商品分类信息分别存于不同表，避免商品分类信息的重复存储。
反范式化设计：在适当的时候，为了提高查询性能，可引入一定的数据冗余。
例如，在一个文章系统中，为了减少关联查询，在文章表中冗余存储作者的部分常用信息。

# 字段类型选择
使用索引：在经常用于查询条件、排序和连接的字段上创建索引。
例如，在 WHERE 子句、JOIN 子句和 ORDER BY 子句涉及的字段上创建索引。
优化查询条件：确保查询条件使用索引，避免在索引字段上使用函数、计算或通配符开头的模糊查询。
例如，避免使用 WHERE YEAR(create_time) = 2024，
可改为 WHERE create_time >= '2024-01-01' AND create_time < '2025-01-01'。
```

#### 1.2
> 索引优化
```js >folded 
# 合理创建索引
覆盖索引：创建包含查询所需所有字段的索引，避免回表查询。
例如，若查询语句为 SELECT id, name FROM users WHERE age > 18，可创建索引 (age, id, name)。
复合索引：在多个字段上创建复合索引，注意字段顺序，将最常用的字段放在前面。
例如，若经常根据 category_id 和 create_time 查询商品，可创建索引 (category_id, create_time)。

# 定期维护索引
重建索引：定期重建索引，以优化索引结构，提高查询性能。
删除无用索引：删除不再使用的索引，减少索引维护的开销。
```

#### 1.3
> 查询语句优化
```js >folded 
# 避免全表扫描
使用索引：在经常用于查询条件、排序和连接的字段上创建索引。
例如，在 WHERE 子句、JOIN 子句和 ORDER BY 子句涉及的字段上创建索引。
优化查询条件：确保查询条件使用索引，避免在索引字段上使用函数、计算或通配符开头的模糊查询。
例如，避免使用 WHERE YEAR(create_time) = 2024，
可改为 WHERE create_time >= '2024-01-01' AND create_time < '2025-01-01'。

# 优化关联查询
使用合适的连接类型：依据业务需求选择 INNER JOIN、LEFT JOIN 等连接类型，避免使用不必要的连接。
减少子查询：子查询可能会导致性能问题，尽量用连接查询替代子查询。
```
#### 1.4
> 服务器配置优化
```js >folded 
# 内存配置
调整 innodb_buffer_pool_size：该参数决定 InnoDB 存储引擎使用的缓冲池大小，合理调整可提高数据读取性能。
一般可将其设置为服务器内存的 70% - 80%。
调整 key_buffer_size：对于 MyISAM 存储引擎，该参数决定索引缓冲区的大小，可根据实际情况进行调整。

# 磁盘 I/O 优化
使用高性能磁盘：如 SSD 磁盘，可显著提高磁盘 I/O 性能。
合理配置磁盘阵列：使用 RAID 技术提高磁盘读写性能和可靠性。
```
#### 1.5
> 数据库监控与分析
```js >folded 
# 使用 EXPLAIN 分析查询语句
通过 EXPLAIN 关键字分析查询语句的执行计划，了解查询是否使用了索引、扫描的行数等信息，从而进行针对性优化。

# 监控数据库性能指标
使用 MySQL 自带的性能监控工具或第三方监控工具，监控数据库的 CPU 使用率、内存使用率、磁盘 I/O 等指标，
及时发现性能瓶颈并进行优化。
```